李守中

硬件 Raid 卡相关

Table of Contents

1. 通用的知识

1.1. 硬盘相关的知识

发生读错误或写错误的扇区会被标记为坏扇区。确切地说处于「pending」状态。因为扇区的重映射仅在硬盘向被标为「pending」的扇区写入数据时发生,所以在读取失败的扇区被写入数据之前,它还没有进入硬盘内的坏扇区列表 (G 表) 中。

每个扇区除存储用户指定的数据之外,还存了本扇区数据的 ECC 校验码,用于校验和恢复本扇区内失真的用户数据。用 ECC 校验码恢复数据的过程由硬盘主控完成。ECC 校验失败且无法恢复就是读错误的一种情况,所以 ECC 校验失败且无法恢复的扇区会被按坏扇区处理。

1.2. 关闭或开启硬盘缓存

硬盘缓存指焊在硬盘电路板上的 RAM 颗粒,断电之后其中的数据丢失。

对于机械硬盘来说,在阵列卡配置中关闭硬盘缓存可以提升阵列的可靠性。因为,在开启缓存时,硬盘将数据放入缓存就向阵列卡报告写入成功,而如果断电发生在硬盘将缓存中的数据写入盘片之前,则导致数据丢失,阵列出现不一致。关闭缓存时,硬盘在把数据写入盘片之后才会向阵列卡报告写入成功,断电不会引起数据不一致。

但机械硬盘中的例外是叠瓦式硬盘,这类硬盘关闭缓存会导致写性能下降到几乎无法接受的程度,很容易出现 I/O 大量超时的问题,所以必须打开硬盘缓存以提高性能。

对于固态硬盘来说,必须在阵列卡配置中打开硬盘缓存以提高硬盘性能。由于阵列卡不支持 trim,所以必须打开固态硬盘的缓存来提升硬盘主控执行 gc 的速度,从而提升硬盘的性能。此外,遇到断电时,硬盘自带的电容中的电量可以让硬盘将缓存中的数据转移到 NAND 颗粒上,所以也不存在丢失固态硬盘缓存内的数据的问题。

由于阵列卡不支持 trim,所有不带缓存的固态又没有主动 gc 的能力,所以不带缓存的硬盘在阵列卡上连最低劣的性能都无法维持,会直接掉盘。

注: 关闭硬盘缓存指的是关闭硬盘的写入缓存,不论写入缓存是否开启,硬盘的读缓存都正常工作。读缓存由硬盘主控控制,用户无法配置。

2. LSI Raid 卡 (以 9271-8i 为例)

2.1. 软件工具

2.1.1. storcli64

storcli v6.14 是最后一个 v6 的版本,是 9271-8i 官方写明支持的最后一个版本的 storcli 工具。

storcli v6 支持使用 storcli64 /c<num> set patrolread maxconcurrentpd=<num> 来设置 Patrol Read 可以一次性处理的硬盘的数量 (默认 255),但无法显示该属性的值。必须要使用至少 0007.0209.0000.0000 版本的 storcli 工具才能让 storcli64 /c<num> show patrolread 也显示 maxconcurrentpd 这个属性。

storcli v6 在显示 CacheVault 的 Next Learn 属性的时候有 bug,v7 修了。

2.1.2. MSM 和 LSA

MSM (MegaRaid Storage Manager) 是 LSI 给 6G/s 的 Raid 卡开发的管理程序,使用本地的 GUI。

LSA (LSI Storage Authority) 是 LSI 给 12G/s 的 Raid 卡开发的管理程序,使用 WebUI。

MSM 从 17.05.03.00 开始需要用户手动安装 JRE 和相关的 java 依赖包,但这个 jar 包已经很久不维护了,而且所需版本的 JRE 不好找。最后一个不需要用户手动处理 JRE 和依赖关系的 MSM 的版本是 17.05.02.01。

但是这个版本无法从 Broadcom 官网下载,官网给的 URL 不对,访问会报 404。正确的下载链接是:

LSA 安装包里 README.txt 的兼容性描述里面没有 2xxx 系列的 6G/s 的芯片,只有 3xxx 系列的 12G/s 的芯片。

2.2. 替换坏盘的流程

如果蜂鸣器在响,可以先用 storcli64 /cx set alarm=silence 让蜂鸣器静音。(不是关闭蜂鸣器,不影响蜂鸣器再响)

  1. 坏盘离线 storcli64 /cx/ey/sz set offline
  2. 坏盘标记缺失 storcli64 /cx/ey/sz set missing
  3. 让坏盘停转 storcli64 /cx/ey/sz spindown
  4. 拔下坏盘,插入新盘
  5. 重建阵列:
    • 如果打开了自动重建,新盘插入之后会自动开始重建。 storcli64 /cx show autorebuild 可以查看是否打开自动重建
    • 如果没有打开自动重建,需要手动标记插入的硬盘 storcli64 /cx/ey/sz insert array=0 row=0 ,array, row 的值可以从 storcli64 /cx/dall show 的输出中获取。标记完成之后,重建会自动开始
    • 对于老版本来说,在标记要加入到阵列的新盘之后,还必须手动开始重建
      1. storcli64 /cx/ey/sz insert dg=0 array=0 row=0 (多一个 dg 参数) 标记插入到阵列的硬盘。dg, array, row 的值可以从 storcli64 /cx/dall show 的输出中获取
      2. storcli64 /cx/ey/sz start rebuild 开始重建

另外,默认的重建阵列时的 I/O 压力是 30%,使用 storcli64 /cx set rebuildrate=<rate> 调高 I/O 压力 (1-100) 可以加快重建。

2.3. Patrol Read 和 Consistency Check (CC)

Patrol Read 作用于硬盘上每个可读的扇区。

Patrol Read 执行时,Raid 卡向硬盘发出 ATA read-verify(0x40) 命令来读取数据。这个命令不会让硬盘向 Raid 卡传输数据,而是让硬盘自行检测扇区数据。

如果 strip 中有硬盘报扇区读取错误,那么 Raid 卡就从属于同一个 strip 的其他硬盘上读数据 (读其他的 strip segment, strip parity 等数据),重建这个报错的这部分数据 (重建 strip segment 或 strip parity)。

数据重建后,使用 ATA write-verify(0x3C) 命令将重建好的数据写入报错的那个硬盘。命令执行成功后,继续验证下一个 strip (其他的扇区)。

Patrol Read 期间如果有无法重建的 strip,比如 Raid5 strip 中的 2 个 strip unit 报错,或者 Raid6 strip 中的 3 个 strip unit 报错,那么这个无法被重建的 strip 会被添加到 Bad Strip Table 中。

Patrol Read 也作用于热备盘。

CC 作用于阵列中使用 RAID 1, 5, 6, 10, 50 或 60 的 Virtual Drive (VD)。

CC 读取 VD 中的每一个 strip 并计算其所包含的数据是否一致。例如,在具有奇偶校验的系统中,检查一致性意味着计算一个硬盘上的数据,然后将结果与奇偶校验硬盘上的内容进行比较。

如果 CC 过程中硬盘报扇区读取错误,那此时 CC 行为与 Patrol Read 相同,即重建数据。

2.4. VD 相关

2.4.1. 在 WebBIOS 中创建的 VD 不能用 storcli64 获取其初始化进度

在 WebBIOS 中创建的 VD 默认使用 fast initialization,VD 立即可用,初始化 VD 的操作在后台进行。如果遇到重启,重启完成之后初始化继续,不会导致初始化重新开始。

但是这个初始化过程无法被 storcli64 /cx/vx show init 观察到。

2.4.2. 使用 storcli64 工具创建的 VD 必须手动初始化

使用 storcli64 命令创建 VD 之后并不会自动启动初始化进程,需要用户手动启动初始化。

2.4.3. 关闭 VD 中 PV 的缓存

在使用机械硬盘建立阵列时,关闭硬盘写入缓存可以有效提高阵列的可靠性。详见通用的知识一节。

关闭 PV 写入缓存的命令为:

storcli /c0/v<num> set pdcache=off

可以用 storcli64 /c0/v<num> show all 来查看 VD 状态,其中,表示 PV 写缓存策略的属性的名称为 Disk Cache Policy 其值应为 Disabled



Last Update: 2024-03-12 Tue 09:38

Generated by: Emacs 28.2 (Org mode 9.5.5)   Contact: [email protected]

若正文中无特殊说明,本站内容遵循: 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议